/*-------------------------------------------------------------------------
 *
 * basebackup_target.h
 *	  添加基础备份目标的可扩展性框架。
 *
 * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group
 *
 * src/include/backup/basebackup_target.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef BASEBACKUP_TARGET_H
#define BASEBACKUP_TARGET_H

#include "backup/basebackup_sink.h"

struct BaseBackupTargetHandle;
typedef struct BaseBackupTargetHandle BaseBackupTargetHandle;

/*
 * 扩展可以调用此函数来创建新的备份目标。
 *
 * 'name' 是新目标的名称。
 *
 * 'check_detail' 是一个接受目标名称和目标详细信息的函数，
 * 如果目标详细信息无效或检测到其他问题（如权限问题），
 * 则抛出错误；否则返回一个指向创建实现该目标的 bbsink 所需数据的指针。
 * 如果没有指定 BASE_BACKUP 命令的 TARGET_DETAIL 选项，
 * 第二个参数将为 NULL。
 *
 * 'get_sink' 是一个创建 bbsink 的函数。第一个参数
 * 是后续的 sink；由此函数创建的 sink 应始终
 * 转发到此 sink。第二个参数是前一次调用 'check_detail'
 * 函数返回的指针。
 *
 * 实际上，用户会输入类似 "pg_basebackup --target foo:bar
 * -Xfetch" 的内容。这将导致服务器查找名为
 * "foo" 的备份目标。如果找到，check_detail 回调将被调用
 * 处理字符串 "bar"，并且该回调返回的内容将作为第二个
 * 参数传递给 get_sink 回调。
 */
extern void BaseBackupAddTarget(char *name,
								void *(*check_detail) (char *, char *),
								bbsink *(*get_sink) (bbsink *, void *));

/*
 * 这些函数由核心代码用于访问通过 BaseBackupAddTarget() 添加的基础备份目标。
 * 核心代码将把来自用户的 TARGET 和 TARGET_DETAIL 字符串传递给
 * BaseBackupGetTargetHandle，该函数将抛出错误（如果 TARGET 
 * 无法识别或该 TARGET 的 check_detail 钩子不喜欢 TARGET_DETAIL），
 * 或返回一个 BaseBackupTargetHandle 对象，稍后可以传递给
 * BaseBackupGetSink。
 *
 * BaseBackupGetSink 使用 BaseBackupTargetHandle 和后续的 bbsink 
 * 构造实现所需目标的 bbsink。它通过安排调用实现基础备份
 * 目标的扩展提供的 get_sink() 回调来完成此操作。
 */
extern BaseBackupTargetHandle *BaseBackupGetTargetHandle(char *target,
														 char *target_detail);
extern bbsink *BaseBackupGetSink(BaseBackupTargetHandle *handle,
								 bbsink *next_sink);

#endif
